// utils/request.js

// 默认的服务器基础请求地址
// 你可以根据实际的开发环境和生产环境来修改这个地址
import config from '../config';

/**
 * 封装 wx.request 请求
 * @param {Object} options - 请求配置对象
 * @param {string} options.url - 请求的相对路径 (会自动拼接 BASE_URL)
 * @param {string} [options.method='GET'] - 请求方法，可选值：GET, POST, PUT, DELETE 等
 * @param {Object} [options.data={}] - 请求参数
 * @param {Object} [options.header={}] - 请求头
 * @returns {Promise} - 返回一个 Promise 对象，用于处理异步请求结果
 */
const request = (options = {
    url: '',
    method: 'GET',
    data: {},
    header: {}
}) => {
    // 确保 options.header 是一个对象, 即使调用时 options 对象中没有 header 属性
    options.header = options.header || {};

    return new Promise((resolve, reject) => {
        // 构造完整的请求 URL
        const requestURL = config.BASE_URL + options.url;

        wx.showLoading({
            title: '加载中...' // 显示加载提示
        });
        if (wx.getStorageSync('token')) {
            options.header['Authorization'] = 'tf: ' + wx.getStorageSync('token');
        }

        wx.request({
            url: requestURL,
            method: options.method || 'GET', // 默认为 GET 请求
            data: options.data || {}, // 默认为空对象
            header: {
                'Content-Type': 'application/json', // 默认请求头
                ...options.header // 合并用户自定义的 header
            },
            success: (res) => {
                // 假设服务器返回的数据结构是 { code: 0, data: ..., msg: '...' }
                // code 为 0 表示成功，其他表示失败
                if (res.statusCode === 200) { // HTTP 状态码 200
                    // 这里可以根据你后端接口返回的数据结构进行统一处理
                    // 例如，有些后端接口成功时 code 可能不是 0，或者数据嵌套层级不同
                    console.log(res.data)
                    if (res.data && res.data.code === 200) { // 业务逻辑成功
                        resolve(res.data); // 返回核心数据部分
                    } else if (res.data && res.data.code === 401) {
                        wx.removeStorageSync('token');
                        wx.removeStorageSync('userInfo');
                        wx.removeStorageSync('config');
                        wx.showToast({
                            title: '登录失效，请重新登录',
                            icon: 'none'
                        });
                        setTimeout(() => {
                            wx.reLaunch({
                                url: '/pages/login/login'
                            });
                        }, 1000);
                    } else {
                        // 业务逻辑失败
                        wx.showToast({
                            title: res.data.msg || res.data.message || '请求数据失败',
                            icon: 'none'
                        });
                        reject(res.data);
                    }
                } else {
                    // HTTP 状态码非 200，视为请求错误
                    wx.showToast({
                        title: '服务器错误，状态码：' + res.statusCode,
                        icon: 'none'
                    });
                    reject(res);
                }
            },
            fail: (err) => {
                // 网络错误或其他 wx.request 调用本身的错误
                wx.showToast({
                    title: '网络请求失败，请检查网络连接',
                    icon: 'none'
                });
                console.error('Request Error:', err);
                reject(err);
            },
            complete: () => {
                wx.hideLoading(); // 隐藏加载提示
            }
        });
    });
};

// 导出封装好的 request 函数，方便其他模块调用
export default request;

// 如果你希望更方便地调用特定类型的请求，可以再封装一层
// 例如：
// export const get = (url, data, header) => request({ url, method: 'GET', data, header });
// export const post = (url, data, header) => request({ url, method: 'POST', data, header });
// export const put = (url, data, header) => request({ url, method: 'PUT', data, header });
// export const del = (url, data, header) => request({ url, method: 'DELETE', data, header }); 